package com.tbgov.service;

import com.tbgov.constant.RedisKeyConst;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Date;

/**
 * @author 1st
 */
@Service
@RequiredArgsConstructor
public class TokenService {

    private static final String SECRET_KEY = "FegZ0aI9KxDG0WRK6j+GUFBeLcv40vBgT2+IysuVThM=";
    // private static final long EXPIRATION_TIME = 3600 * 1000; // 1小时
    final StringRedisTemplate redisTemplate; // Redis 操作模板

    public String generateToken(String username) {
        // 使用 SecretKeySpec 创建密钥对象
        Key key = new SecretKeySpec(SECRET_KEY.getBytes(), SignatureAlgorithm.HS256.getJcaName());
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + RedisKeyConst.TOKEN_EXPIRATION_TIME))
                .signWith(key)
                .compact();
    }

    public String validateToken(String token) {
        try {
            // 创建密钥对象
            Key key = new SecretKeySpec(SECRET_KEY.getBytes(), SignatureAlgorithm.HS256.getJcaName());
            // 设置签名密钥
            JwtParser parser = Jwts.parserBuilder().setSigningKey(key).build();
            // 解析 Token 并获取 Claims
            Claims claims = parser.parseClaimsJws(token).getBody();
            /* 返回 Token 的主体（例如用户名）
            return claims.getSubject();*/
            // 检查 Redis 中是否存在该 token
            Boolean exists = redisTemplate.hasKey(token);
            if (Boolean.TRUE.equals(exists)) {
                return claims.getSubject();
            } else {
                return null; // Token 不存在，可能已被删除或过期
            }
        } catch (Exception e) {
            // Token 无效或已过期
            return null;
        }
    }

    public void deleteToken(String token) {
        // 删除 Redis 中的 token
        redisTemplate.delete(token);
    }
}
